package com.compasudea.polla.persistencia;

import com.compasudea.polla.negocio.dto.UsuarioDTO;
import com.compasudea.polla.persistencia.dao.DatabaseUsuarioDAO;
import com.compasudea.polla.persistencia.dao.UsuarioDAO;

/**
 * Entidad que representa al objeto usuario.
 * @author Ivan Londono.
 */
public class Usuario {

	/** Id de autenticacion del usuario.*/
	private String idUser;
	
	/** Clave de autenticacion del usuario.*/
	private String clave;
	
	/** Nombres del usuario.*/
	private String nombres;
	
	/** Apellidos del usuario.*/
	private String apellidos;
	
	/** email del usuario.*/
	private String email;

	/**
	 * Permite obtener el valor de la variable idUser
	 * @return valor de la variable idUser.
	 */
	public String getIdUser() {
		return idUser;
	}
	
	/**
	 * Asigna el valor a la variable idUser.
	 * @param idUser valor a asignar a la variable.
	 */
	public void setIdUser(String idUser) {
		this.idUser = idUser;
	}

	/**
	 * Permite obtener el valor de la variable clave
	 * @return valor de la variable clave.
	 */
	public String getClave() {
		return clave;
	}

	/**
	 * Asigna el valor a la variable clave.
	 * @param clave valor a asignar a la variable.
	 */
	public void setClave(String clave) {
		this.clave = clave;
	}
	
	/**
	 * Permite obtener el valor de la variable nombres
	 * @return nombres de la variable clave.
	 */
	public String getNombres() {
		return nombres;
	}

	/**
	 * Asigna el valor a la variable nombres.
	 * @param nombres valor a asignar a la variable.
	 */
	public void setNombres(String nombres) {
		this.nombres = nombres;
	}

	/**
	 * Permite obtener el valor de la variable apellidos
	 * @return valor de la variable apellidos.
	 */
	public String getApellidos() {
		return apellidos;
	}

	/**
	 * Asigna el valor a la variable apellidos.
	 * @param apellidos valor a asignar a la variable.
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
	
	/**
	 * Permite obtener el valor de la variable email
	 * @return valor de la variable email.
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * Asigna el valor a la variable email.
	 * @param email valor a asignar a la variable.
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * Metodo que permite validar si existe un usuario con id y clave iguales
	 * a las ingresadas como parametros.
	 * @return true si existe, false en otro caso.
	 */
	public static boolean existeUsuario(UsuarioDTO userDTO) {
		
		UsuarioDAO dao = new DatabaseUsuarioDAO();
		return dao.existeUsuario(userDTO.getIdUser(), userDTO.getClave());
	}
	
	/**
	 * Permite transmitir toda la informacion de la entidad que representa al usuario
	 * hacia el objeto encargado de transmitir la informacion a traves de las diferentes capas
	 * de la aplicacion.
	 * @param userDTO DTO al que se le desea transmitir la informacion de la entidad.
	 * @return UsuarioDTO con la informacion correspondiente.
	 */
	public UsuarioDTO poblarDTO(UsuarioDTO userDTO) {
		
		if (userDTO == null) {
			userDTO = new UsuarioDTO();
		}
		
		userDTO.setIdUser(this.idUser);
		userDTO.setClave(this.clave);
		userDTO.setNombres(this.nombres);
		userDTO.setApellidos(this.apellidos);
		userDTO.setEmail(this.email);
		
		return userDTO;		
	}
	
	/**
	 * Permite asignar la informacion que trae el objeto UsuarioDTO a la entidad Usuario.
	 * @param userDTO DTO que contiene la informacion que se debe asignar a la entidad.
	 */
	public void poblarEntity(UsuarioDTO userDTO) throws Exception {
		
		if (userDTO != null) {
			this.idUser = userDTO.getIdUser();
			this.clave = userDTO.getClave();
			this.nombres = userDTO.getNombres();
			this.apellidos = userDTO.getApellidos();
			this.email = userDTO.getEmail();
			
		} else {
			throw new Exception();
		}
	}
		
	/**
	 * Permite guardar un usuario en la base de datos.
	 * @param user objeto que contiene la informacion del usuario a almacenar.
	 */
	public void guardarUsuario() {
		UsuarioDAO dao = new DatabaseUsuarioDAO();
		dao.guardarUsuario(this);
	}
	
	/**
	 * Permite actualizar un usuario en la base de datos.
	 * @param user objeto que contiene la informacion del usuario a actualizar.
	 */
	public void actualizarUsuario() {
		UsuarioDAO dao = new DatabaseUsuarioDAO();
		dao.actualizarUsuario(this);
	}
	
}
